'''
description:
 用于扫描仪只能扫描一面的情况下，合并正反面扫描的PDF文件。
 第一个文件为奇数页文件，第二个文件为偶数页文件。

hint:
 当两个文件页码不一致时，会退出。可以去掉exit()指令
     这时：如果第1个文件的页码大于第2个文件，会出错退出；反之，会合并第2个文件部分文件。
require:
 用到的第三方库为pypdf2
 没有安装的情况下：
    pip install pypdf2

author:Panda Lee
E-mail:bufeii@gmail.com

'''


from PyPDF2 import PdfWriter
from PyPDF2 import PdfReader
from tkinter.filedialog import askopenfilename
from tkinter import messagebox as msg
import tkinter as tk
import os
import time


class pdfXMerge():

    def __init__(self):
        
        self.root=tk.Tk()
        self.root.title('扫描文件交叉合并（PDF）')
        self.root.update()
        tk.Button(self.root, text="正面扫描文件",pady=4,command=self._selectfile1).grid(row=0, column=0)      
        tk.Button(self.root, text="反面扫描文件",pady=4,command=self._selectfile2).grid(row=2, column=0)
        tk.Button(self.root, text="合 并 文 件",pady=4,command=self.startJob).grid(row=4, column=0,rowspan=2)

        self.file_front = tk.Label(self.root)
        self.file_front.grid(row=0, column=1,columnspan=4)
        self.file_back =tk.Label(self.root)
        self.file_back.grid(row=2, column=1,columnspan=4)
        self.res=tk.Text(self.root)
        self.res.grid(row=4, column=1,columnspan=2,rowspan=4)


        

        self.file1=askopenfilename(title='打开第一个文件（奇数页文件）')
        self.file_front.configure(text=self.file1)

        self.file2=askopenfilename(title='打开第二个文件（偶数页文件）')
        self.file_back.configure(text=self.file2)

        self.merger = PdfWriter()


        #self._checkOK(self.file1,self.file2)

        self.root.mainloop()


    def _selectfile1(self):
        self.file1=askopenfilename(title='打开第一个文件（奇数页文件）')
        self.file_front.configure(text=self.file1)
    def _selectfile2(self):
        self.file2=askopenfilename(title='打开第二个文件（偶数页文件）')
        self.file_back.configure(text=self.file2)        

    def _checkOK(self,f1,f2)->bool:
        if not(len(f1)>0 and len(f2)>0):
            msg.showinfo('info','有一个或两个文件没有选中！')
            return False
        input1 = open(f1, "rb")
        input2 = open(f2, "rb")

        p=PdfReader(input1)
        n=len(p.pages)

        n1=len(PdfReader(input2).pages)

        self.res.insert(tk.INSERT,"正面：共"+str(n)+'页  '+f1+'\n\n')
        self.res.insert(tk.INSERT,"反面：共"+str(n1)+'页  '+f2+'\n')

        if n!=n1:
            #msg.showwarning("失败！","两个文件页数不一致，不能合并")
            self.res.insert(tk.INSERT,"\n两个文件页数不一致，不能合并\n请检查文件\n")
            self.res.insert(tk.INSERT,'\n'+'--'*20+'\n\n')
            self.root.update()
            time.sleep(1)
            return False
        else:
            self.res.insert(tk.INSERT,'\n文件页码相同，OK\n')
            self.res.insert(tk.INSERT,'\n'+'--'*20+'\n')

            return True


    def _pdfMerge(self,f1,f2)->None:
        input1=None
        input2=None

        input1 = open(f1, "rb")
        input2 = open(f2, "rb")

        p1=PdfReader(input1)
        n1=len(p1.pages)
        p2=PdfReader(input2)
        n2=len(p2.pages)
        n1==n2
        for i in range(n1):
            # add odd page
            self.merger.append(fileobj=input1, pages=(i,i+1))
            
            # add even page,inverse pages
            self.merger.append(fileobj=input2, pages=(n1-1-i, n1-i))

            self.res.insert(tk.INSERT,str(i+1)+'...')
            self.root.update()
        self.res.insert(tk.INSERT,'\n'*2+'--'*20+'\n')
        # Write to an output PDF document
        output = open("X-merge-document.pdf", "wb")
        self.merger.write(output)
        output.close()
        self.res.insert(tk.INSERT,'\n合并后共 '+str(n*2)+' 页\n')
        self.res.insert(tk.INSERT,"存储在当前文件夹: "+os.getcwd()+'\n')
        self.res.insert(tk.INSERT,"文件名： "+"X-merge-document.pdf")
        self.res.delete('1.0','end')


    def startJob(self):
        if self._checkOK(self.file1,self.file2):
            self._pdfMerge(self.file1,self.file2)
        else:
            pass
            #exit()
    

# Close File Descriptors


m=pdfXMerge()
